Code to compute magnetic declination. Not currently in GPSBabel; parked here for...
authorparkrrrr <parkrrrr@f51c46e8-681c-474f-0cfe-069cfd0219fb>
Thu, 5 Aug 2004 15:37:10 +0000 (15:37 +0000)
committerparkrrrr <parkrrrr@f51c46e8-681c-474f-0cfe-069cfd0219fb>
Thu, 5 Aug 2004 15:37:10 +0000 (15:37 +0000)
declination/decline.c [new file with mode: 0644]

diff --git a/declination/decline.c b/declination/decline.c
new file mode 100644 (file)
index 0000000..25fe6f0
--- /dev/null
@@ -0,0 +1,654 @@
+
+/*
+    Declination function
+
+    Copyright (C) 2002 Robert Lipe, robertlipe@usa.net
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA
+
+ */
+#include <stdio.h>
+#include <math.h>
+#include "defs.h"
+
+static double gh[];
+
+#define STANDALONE
+
+        
+/*
+These comments are from the original Fortran code from IGRF
+
+  subroutine igrf9syn (isv,date,itype,alt,colat,elong,x,y,z,f)
+  c
+  c     This is a synthesis routine for the 9th generation IGRF as agreed 
+  c     in July 2003 by IAGA Working Group V-8. It is valid 1900.0 to 2005.0 
+  c     inclusive. Values for dates from 1945.0 to 2000.0 inclusive are 
+  c     definitve, otherwise they are non-definitive.
+  c   INPUT
+  c     isv   = 0 if main-field values are required
+  c     isv   = 1 if secular variation values are required
+  c     date  = year A.D. Must be greater than or equal to 1900.0 and 
+  c             less than or equal to 2010.0. Warning message is given 
+  c             for dates greater than 2005.0. Must be double precision.
+  c     itype = 1 if geodetic (spheroid)
+  c     itype = 2 if geocentric (sphere)
+  c     alt   = height in km above sea level if itype = 1
+  c           = distance from centre of Earth in km if itype = 2 (>3485 km)
+  c     colat = colatitude (0-180)
+  c     elong = east-longitude (0-360)
+  c     alt, colat and elong must be double precision.
+  c   OUTPUT
+  c     x     = north component (nT) if isv = 0, nT/year if isv = 1
+  c     y     = east component (nT) if isv = 0, nT/year if isv = 1
+  c     z     = vertical component (nT) if isv = 0, nT/year if isv = 1
+  c     f     = total intensity (nT) if isv = 0, rubbish if isv = 1
+  c
+  c     To get the other geomagnetic elements (D, I, H and secular
+  c     variations dD, dH, dI and dF) use routines ptoc and ptocsv.
+  c
+  c     Adapted from 8th generation version to include new maximum degree for
+  c     main-field models for 2000.0 and onwards and use WGS84 spheroid instead
+  c     of International Astronomical Union 1966 spheroid as recommended by IAGA
+  c     in July 2003. Reference radius remains as 6371.2 km - it is NOT the mean
+  c     radius (= 6371.0 km) but 6371.2 km is what is used in determining the
+  c     coefficients. Adaptation by Susan Macmillan, August 2003.
+  */
+  
+  double declination( double date, double alt, double lat, double lon ) {
+      
+      double cl[14];
+      double sl[14];
+      double p[106];
+      double q[106];
+      
+      double x = 0;
+      double y = 0;
+      double z = 0;
+      double f = 0;
+      
+      double colat = 90 - lat;
+      double elong = lon;
+      
+      double t;
+      double ll;
+      double one;
+      double two;
+      double three;
+      double rho;
+      double tc;
+      
+      double r;
+      double ct;
+      double st;
+      double cd;
+      double sd;
+      
+      double a2;
+      double b2;
+      double ratio;
+      double rr;
+      
+      double fn;
+      double gn;
+      double fm;
+      double gmm;
+     
+      int i;
+      int j;
+      int k; 
+      int kmx;
+      int l;
+      int lm;
+      int m;
+      int n;
+      int nc;
+      int nmx;
+      
+      /*
+      c     set initial values
+      */ 
+      x     = 0.0;
+      y     = 0.0;
+      z     = 0.0;
+      if ( date >= 1900 && date <= 2010 ) {
+      /*
+      if (date.gt.2005.0) write (6,960) date
+      960 format (/' This version of the IGRF is intended for use up',
+      1        ' to 2005.0.'/' values for',f9.3,' will be computed',
+      2        ' but may be of reduced accuracy'/)
+          */
+          if (date < 2000.0) { 
+              t     = 0.2*(date - 1900.0);
+              ll    = t;
+              one   = ll;
+              t     = t - one;
+              if (date <= 1995.0) {
+                  nmx   = 10;
+                  nc    = nmx*(nmx+2);
+                  ll    = nc*ll;
+                  kmx   = (nmx+1)*(nmx+2)/2;
+              }
+              else {
+                  nmx   = 13;
+                  nc    = nmx*(nmx+2);
+                  ll    = 0.2*(date - 1995.0);
+                  ll    = 120*19 + nc*ll;
+                  kmx   = (nmx+1)*(nmx+2)/2;
+              }
+              tc    = 1.0 - t;
+          }
+          else {
+              t     = date - 2000.0;
+              tc    = 1.0;
+              ll    = 2475;
+              nmx   = 13;
+              nc    = nmx*(nmx+2);
+              kmx   = (nmx+1)*(nmx+2)/2;
+          }
+          
+          r     = alt;
+          one   = colat*M_PI/180;
+          ct    = cos(one);
+          st    = sin(one);
+          one   = elong*M_PI/180;
+          cl[1] = cos(one);
+          sl[1] = sin(one);
+          cd    = 1.0;
+          sd    = 0.0;
+          l     = 1;
+          m     = 1;
+          n     = 0;
+          /*
+          c     conversion from geodetic to geocentric coordinates 
+          c     (using the WGS84 spheroid)
+          */
+          a2    = 40680631.6;
+          b2    = 40408296.0;
+          one   = a2*st*st;
+          two   = b2*ct*ct;
+          three = one + two;
+          rho   = sqrt(three);
+          r     = sqrt(alt*(alt + 2.0*rho) + (a2*one + b2*two)/three);
+          cd    = (alt + rho)/r;
+          sd    = (a2 - b2)/rho*ct*st/r;
+          one   = ct;
+          ct    = ct*cd -  st*sd;
+          st    = st*cd + one*sd;
+          
+          ratio = 6371.2/r;
+          rr    = ratio*ratio;
+          /*
+          c     computation of Schmidt quasi-normal coefficients p and x(=q)
+          */
+          p[1]  = 1.0;
+          p[3]  = st;
+          q[1]  = 0.0;
+          q[3]  =  ct;
+          for ( k = 2; k <= kmx; k++ ) {
+              if (n < m) {
+                  m     = 0;
+                  n     = n + 1;
+                  rr    = rr*ratio;
+                  fn    = n;
+                  gn    = n - 1;
+              }
+              fm    = m;
+              if (m == n) {
+                  if (k != 3) {
+                      one   = sqrt(1.0 - 0.5/fm);
+                      j     = k - n - 1;
+                      p[k]  = one*st*p[j];
+                      q[k]  = one*(st*q[j] + ct*p[j]);
+                      cl[m] = cl[m-1]*cl[1] - sl[m-1]*sl[1];
+                      sl[m] = sl[m-1]*cl[1] + cl[m-1]*sl[1];
+                  }
+              }
+              else {
+                  gmm    = m*m;
+                  one   = sqrt(fn*fn - gmm);
+                  two   = sqrt(gn*gn - gmm)/one;
+                  three = (fn + gn)/one;
+                  i     = k - n;
+                  j     = i - n + 1;
+                  p[k]  = three*ct*p[i] - two*p[j];
+                  q[k]  = three*(ct*q[i] - st*p[i]) - two*q[j];
+              }
+              /*
+              c     synthesis of x, y and z in geocentric coordinates
+              */
+              lm    = ll + l;
+              one   = (tc*gh[lm] + t*gh[lm+nc])*rr;
+              if (m != 0) {
+                  two   = (tc*gh[lm+1] + t*gh[lm+nc+1])*rr;
+                  three = one*cl[m] + two*sl[m];
+                  x     = x + three*q[k];
+                  z     = z - (fn + 1.0)*three*p[k];
+                  if (st != 0.0) {
+                      y     = y + (one*sl[m] - two*cl[m])*fm*p[k]/st;
+                  }
+                  else {
+                      y     = y + (one*sl[m] - two*cl[m])*q[k]*ct;
+                  }
+                  l     = l + 2;
+              }
+              else {
+                  x     = x + one*q[k];
+                  z     = z - (fn + 1.0)*one*p[k];
+                  l     = l + 1;
+              }
+              m     = m + 1;
+          }
+          /*
+          c     conversion to coordinate system specified by itype
+          */
+          one   = x;
+          x     = x*cd +   z*sd;
+              
+          return 180/M_PI*atan2(y,x);
+      }
+      /*
+      c     error return if date out of bounds
+      */
+      /*
+      fatal ( "Can't compute declination for dates outside of 1900-2010\n" );
+      */
+      return 999;
+}
+
+
+#ifdef STANDALONE
+  int main(int c, char **v) {
+         double lat = atof(v[1]);
+         double lon = atof(v[2]);
+         double date = atof(v[3]);
+         double dec = declination( date, 0, lat, lon );
+         printf( "declination is %f at %f,%f on %f\n\n", dec, lat, lon, date );
+         return 0;
+  }
+#endif
+
+
+static double gh[] = {
+    0,
+        /* 1900 */ 
+        -31543.,-2298., 5922., -677., 2905.,-1061.,  924., 1121.,
+        1022.,-1469., -330., 1256.,    3.,  572.,  523.,  876.,
+        628.,  195.,  660.,  -69., -361., -210.,  134.,  -75.,
+        -184.,  328., -210.,  264.,   53.,    5.,  -33.,  -86.,
+        -124.,  -16.,    3.,   63.,   61.,   -9.,  -11.,   83.,
+        -217.,    2.,  -58.,  -35.,   59.,   36.,  -90.,  -69.,
+        70.,  -55.,  -45.,    0.,  -13.,   34.,  -10.,  -41.,
+        -1.,  -21.,   28.,   18.,  -12.,    6.,  -22.,   11.,
+        8.,    8.,   -4.,  -14.,   -9.,    7.,    1.,  -13.,
+        2.,    5.,   -9.,   16.,    5.,   -5.,    8.,  -18.,
+        8.,   10.,  -20.,    1.,   14.,  -11.,    5.,   12.,
+        -3.,    1.,   -2.,   -2.,    8.,    2.,   10.,   -1.,
+        -2.,   -1.,    2.,   -3.,   -4.,    2.,    2.,    1.,
+        -5.,    2.,   -2.,    6.,    6.,   -4.,    4.,    0.,
+        0.,   -2.,    2.,    4.,    2.,    0.,    0.,   -6.,
+        /* 1905 */
+        -31464.,-2298., 5909., -728., 2928.,-1086., 1041., 1065.,
+        1037.,-1494., -357., 1239.,   34.,  635.,  480.,  880.,
+        643.,  203.,  653.,  -77., -380., -201.,  146.,  -65.,
+        -192.,  328., -193.,  259.,   56.,   -1.,  -32.,  -93.,
+        -125.,  -26.,   11.,   62.,   60.,   -7.,  -11.,   86.,
+        -221.,    4.,  -57.,  -32.,   57.,   32.,  -92.,  -67.,
+        70.,  -54.,  -46.,    0.,  -14.,   33.,  -11.,  -41.,
+        0.,  -20.,   28.,   18.,  -12.,    6.,  -22.,   11.,
+        8.,    8.,   -4.,  -15.,   -9.,    7.,    1.,  -13.,
+        2.,    5.,   -8.,   16.,    5.,   -5.,    8.,  -18.,
+        8.,   10.,  -20.,    1.,   14.,  -11.,    5.,   12.,
+        -3.,    1.,   -2.,   -2.,    8.,    2.,   10.,    0.,
+        -2.,   -1.,    2.,   -3.,   -4.,    2.,    2.,    1.,
+        -5.,    2.,   -2.,    6.,    6.,   -4.,    4.,    0.,
+        0.,   -2.,    2.,    4.,    2.,    0.,    0.,   -6.,
+        /* 1910 */
+        -31354.,-2297., 5898., -769., 2948.,-1128., 1176., 1000.,
+        1058.,-1524., -389., 1223.,   62.,  705.,  425.,  884.,
+        660.,  211.,  644.,  -90., -400., -189.,  160.,  -55.,
+        -201.,  327., -172.,  253.,   57.,   -9.,  -33., -102.,
+        -126.,  -38.,   21.,   62.,   58.,   -5.,  -11.,   89.,
+        -224.,    5.,  -54.,  -29.,   54.,   28.,  -95.,  -65.,
+        71.,  -54.,  -47.,    1.,  -14.,   32.,  -12.,  -40.,
+        1.,  -19.,   28.,   18.,  -13.,    6.,  -22.,   11.,
+        8.,    8.,   -4.,  -15.,   -9.,    6.,    1.,  -13.,
+        2.,    5.,   -8.,   16.,    5.,   -5.,    8.,  -18.,
+        8.,   10.,  -20.,    1.,   14.,  -11.,    5.,   12.,
+        -3.,    1.,   -2.,   -2.,    8.,    2.,   10.,    0.,
+        -2.,   -1.,    2.,   -3.,   -4.,    2.,    2.,    1.,
+        -5.,    2.,   -2.,    6.,    6.,   -4.,    4.,    0.,
+        0.,   -2.,    2.,    4.,    2.,    0.,    0.,   -6.,
+        /* 1915 */
+        -31212.,-2306., 5875., -802., 2956.,-1191., 1309.,  917.,
+        1084.,-1559., -421., 1212.,   84.,  778.,  360.,  887.,
+        678.,  218.,  631., -109., -416., -173.,  178.,  -51.,
+        -211.,  327., -148.,  245.,   58.,  -16.,  -34., -111.,
+        -126.,  -51.,   32.,   61.,   57.,   -2.,  -10.,   93.,
+        -228.,    8.,  -51.,  -26.,   49.,   23.,  -98.,  -62.,
+        72.,  -54.,  -48.,    2.,  -14.,   31.,  -12.,  -38.,
+        2.,  -18.,   28.,   19.,  -15.,    6.,  -22.,   11.,
+        8.,    8.,   -4.,  -15.,   -9.,    6.,    2.,  -13.,
+        3.,    5.,   -8.,   16.,    6.,   -5.,    8.,  -18.,
+        8.,   10.,  -20.,    1.,   14.,  -11.,    5.,   12.,
+        -3.,    1.,   -2.,   -2.,    8.,    2.,   10.,    0.,
+        -2.,   -1.,    2.,   -3.,   -4.,    2.,    2.,    1.,
+        -5.,    2.,   -2.,    6.,    6.,   -4.,    4.,    0.,
+        0.,   -2.,    1.,    4.,    2.,    0.,    0.,   -6.,
+        /* 1920 */
+        -31060.,-2317., 5845., -839., 2959.,-1259., 1407.,  823.,
+        1111.,-1600., -445., 1205.,  103.,  839.,  293.,  889.,
+        695.,  220.,  616., -134., -424., -153.,  199.,  -57.,
+        -221.,  326., -122.,  236.,   58.,  -23.,  -38., -119.,
+        -125.,  -62.,   43.,   61.,   55.,    0.,  -10.,   96.,
+        -233.,   11.,  -46.,  -22.,   44.,   18., -101.,  -57.,
+        73.,  -54.,  -49.,    2.,  -14.,   29.,  -13.,  -37.,
+        4.,  -16.,   28.,   19.,  -16.,    6.,  -22.,   11.,
+        7.,    8.,   -3.,  -15.,   -9.,    6.,    2.,  -14.,
+        4.,    5.,   -7.,   17.,    6.,   -5.,    8.,  -19.,
+        8.,   10.,  -20.,    1.,   14.,  -11.,    5.,   12.,
+        -3.,    1.,   -2.,   -2.,    9.,    2.,   10.,    0.,
+        -2.,   -1.,    2.,   -3.,   -4.,    2.,    2.,    1.,
+        -5.,    2.,   -2.,    6.,    6.,   -4.,    4.,    0.,
+        0.,   -2.,    1.,    4.,    3.,    0.,    0.,   -6.,
+        /* 1925 */
+        -30926.,-2318., 5817., -893., 2969.,-1334., 1471.,  728.,
+        1140.,-1645., -462., 1202.,  119.,  881.,  229.,  891.,
+        711.,  216.,  601., -163., -426., -130.,  217.,  -70.,
+        -230.,  326.,  -96.,  226.,   58.,  -28.,  -44., -125.,
+        -122.,  -69.,   51.,   61.,   54.,    3.,   -9.,   99.,
+        -238.,   14.,  -40.,  -18.,   39.,   13., -103.,  -52.,
+        73.,  -54.,  -50.,    3.,  -14.,   27.,  -14.,  -35.,
+        5.,  -14.,   29.,   19.,  -17.,    6.,  -21.,   11.,
+        7.,    8.,   -3.,  -15.,   -9.,    6.,    2.,  -14.,
+        4.,    5.,   -7.,   17.,    7.,   -5.,    8.,  -19.,
+        8.,   10.,  -20.,    1.,   14.,  -11.,    5.,   12.,
+        -3.,    1.,   -2.,   -2.,    9.,    2.,   10.,    0.,
+        -2.,   -1.,    2.,   -3.,   -4.,    2.,    2.,    1.,
+        -5.,    2.,   -2.,    6.,    6.,   -4.,    4.,    0.,
+        0.,   -2.,    1.,    4.,    3.,    0.,    0.,   -6.,
+        /* 1930 */
+        -30805.,-2316., 5808., -951., 2980.,-1424., 1517.,  644.,
+        1172.,-1692., -480., 1205.,  133.,  907.,  166.,  896.,
+        727.,  205.,  584., -195., -422., -109.,  234.,  -90.,
+        -237.,  327.,  -72.,  218.,   60.,  -32.,  -53., -131.,
+        -118.,  -74.,   58.,   60.,   53.,    4.,   -9.,  102.,
+        -242.,   19.,  -32.,  -16.,   32.,    8., -104.,  -46.,
+        74.,  -54.,  -51.,    4.,  -15.,   25.,  -14.,  -34.,
+        6.,  -12.,   29.,   18.,  -18.,    6.,  -20.,   11.,
+        7.,    8.,   -3.,  -15.,   -9.,    5.,    2.,  -14.,
+        5.,    5.,   -6.,   18.,    8.,   -5.,    8.,  -19.,
+        8.,   10.,  -20.,    1.,   14.,  -12.,    5.,   12.,
+        -3.,    1.,   -2.,   -2.,    9.,    3.,   10.,    0.,
+        -2.,   -2.,    2.,   -3.,   -4.,    2.,    2.,    1.,
+        -5.,    2.,   -2.,    6.,    6.,   -4.,    4.,    0.,
+        0.,   -2.,    1.,    4.,    3.,    0.,    0.,   -6.,
+        /* 1935 */
+        -30715.,-2306., 5812.,-1018., 2984.,-1520., 1550.,  586.,
+        1206.,-1740., -494., 1215.,  146.,  918.,  101.,  903.,
+        744.,  188.,  565., -226., -415.,  -90.,  249., -114.,
+        -241.,  329.,  -51.,  211.,   64.,  -33.,  -64., -136.,
+        -115.,  -76.,   64.,   59.,   53.,    4.,   -8.,  104.,
+        -246.,   25.,  -25.,  -15.,   25.,    4., -106.,  -40.,
+        74.,  -53.,  -52.,    4.,  -17.,   23.,  -14.,  -33.,
+        7.,  -11.,   29.,   18.,  -19.,    6.,  -19.,   11.,
+        7.,    8.,   -3.,  -15.,   -9.,    5.,    1.,  -15.,
+        6.,    5.,   -6.,   18.,    8.,   -5.,    7.,  -19.,
+        8.,   10.,  -20.,    1.,   15.,  -12.,    5.,   11.,
+        -3.,    1.,   -3.,   -2.,    9.,    3.,   11.,    0.,
+        -2.,   -2.,    2.,   -3.,   -4.,    2.,    2.,    1.,
+        -5.,    2.,   -2.,    6.,    6.,   -4.,    4.,    0.,
+        0.,   -1.,    2.,    4.,    3.,    0.,    0.,   -6.,
+        /* 1940 */
+        -30654.,-2292., 5821.,-1106., 2981.,-1614., 1566.,  528.,
+        1240.,-1790., -499., 1232.,  163.,  916.,   43.,  914.,
+        762.,  169.,  550., -252., -405.,  -72.,  265., -141.,
+        -241.,  334.,  -33.,  208.,   71.,  -33.,  -75., -141.,
+        -113.,  -76.,   69.,   57.,   54.,    4.,   -7.,  105.,
+        -249.,   33.,  -18.,  -15.,   18.,    0., -107.,  -33.,
+        74.,  -53.,  -52.,    4.,  -18.,   20.,  -14.,  -31.,
+        7.,   -9.,   29.,   17.,  -20.,    5.,  -19.,   11.,
+        7.,    8.,   -3.,  -14.,  -10.,    5.,    1.,  -15.,
+        6.,    5.,   -5.,   19.,    9.,   -5.,    7.,  -19.,
+        8.,   10.,  -21.,    1.,   15.,  -12.,    5.,   11.,
+        -3.,    1.,   -3.,   -2.,    9.,    3.,   11.,    1.,
+        -2.,   -2.,    2.,   -3.,   -4.,    2.,    2.,    1.,
+        -5.,    2.,   -2.,    6.,    6.,   -4.,    4.,    0.,
+        0.,   -1.,    2.,    4.,    3.,    0.,    0.,   -6.,
+        /* 1945 */
+        -30594.,-2285., 5810.,-1244., 2990.,-1702., 1578.,  477.,
+        1282.,-1834., -499., 1255.,  186.,  913.,  -11.,  944.,
+        776.,  144.,  544., -276., -421.,  -55.,  304., -178.,
+        -253.,  346.,  -12.,  194.,   95.,  -20.,  -67., -142.,
+        -119.,  -82.,   82.,   59.,   57.,    6.,    6.,  100.,
+        -246.,   16.,  -25.,   -9.,   21.,  -16., -104.,  -39.,
+        70.,  -40.,  -45.,    0.,  -18.,    0.,    2.,  -29.,
+        6.,  -10.,   28.,   15.,  -17.,   29.,  -22.,   13.,
+        7.,   12.,   -8.,  -21.,   -5.,  -12.,    9.,   -7.,
+        7.,    2.,  -10.,   18.,    7.,    3.,    2.,  -11.,
+        5.,  -21.,  -27.,    1.,   17.,  -11.,   29.,    3.,
+        -9.,   16.,    4.,   -3.,    9.,   -4.,    6.,   -3.,
+        1.,   -4.,    8.,   -3.,   11.,    5.,    1.,    1.,
+        2.,  -20.,   -5.,   -1.,   -1.,   -6.,    8.,    6.,
+        -1.,   -4.,   -3.,   -2.,    5.,    0.,   -2.,   -2.,
+        /* 1950 */
+        -30554.,-2250., 5815.,-1341., 2998.,-1810., 1576.,  381.,
+        1297.,-1889., -476., 1274.,  206.,  896.,  -46.,  954.,
+        792.,  136.,  528., -278., -408.,  -37.,  303., -210.,
+        -240.,  349.,    3.,  211.,  103.,  -20.,  -87., -147.,
+        -122.,  -76.,   80.,   54.,   57.,   -1.,    4.,   99.,
+        -247.,   33.,  -16.,  -12.,   12.,  -12., -105.,  -30.,
+        65.,  -55.,  -35.,    2.,  -17.,    1.,    0.,  -40.,
+        10.,   -7.,   36.,    5.,  -18.,   19.,  -16.,   22.,
+        15.,    5.,   -4.,  -22.,   -1.,    0.,   11.,  -21.,
+        15.,   -8.,  -13.,   17.,    5.,   -4.,   -1.,  -17.,
+        3.,   -7.,  -24.,   -1.,   19.,  -25.,   12.,   10.,
+        2.,    5.,    2.,   -5.,    8.,   -2.,    8.,    3.,
+        -11.,    8.,   -7.,   -8.,    4.,   13.,   -1.,   -2.,
+        13.,  -10.,   -4.,    2.,    4.,   -3.,   12.,    6.,
+        3.,   -3.,    2.,    6.,   10.,   11.,    3.,    8.,
+        /* 1955 */
+        -30500.,-2215., 5820.,-1440., 3003.,-1898., 1581.,  291.,
+        1302.,-1944., -462., 1288.,  216.,  882.,  -83.,  958.,
+        796.,  133.,  510., -274., -397.,  -23.,  290., -230.,
+        -229.,  360.,   15.,  230.,  110.,  -23.,  -98., -152.,
+        -121.,  -69.,   78.,   47.,   57.,   -9.,    3.,   96.,
+        -247.,   48.,   -8.,  -16.,    7.,  -12., -107.,  -24.,
+        65.,  -56.,  -50.,    2.,  -24.,   10.,   -4.,  -32.,
+        8.,  -11.,   28.,    9.,  -20.,   18.,  -18.,   11.,
+        9.,   10.,   -6.,  -15.,  -14.,    5.,    6.,  -23.,
+        10.,    3.,   -7.,   23.,    6.,   -4.,    9.,  -13.,
+        4.,    9.,  -11.,   -4.,   12.,   -5.,    7.,    2.,
+        6.,    4.,   -2.,    1.,   10.,    2.,    7.,    2.,
+        -6.,    5.,    5.,   -3.,   -5.,   -4.,   -1.,    0.,
+        2.,   -8.,   -3.,   -2.,    7.,   -4.,    4.,    1.,
+        -2.,   -3.,    6.,    7.,   -2.,   -1.,    0.,   -3.,
+        /* 1960 */
+        -30421.,-2169., 5791.,-1555., 3002.,-1967., 1590.,  206.,
+        1302.,-1992., -414., 1289.,  224.,  878., -130.,  957.,
+        800.,  135.,  504., -278., -394.,    3.,  269., -255.,
+        -222.,  362.,   16.,  242.,  125.,  -26., -117., -156.,
+        -114.,  -63.,   81.,   46.,   58.,  -10.,    1.,   99.,
+        -237.,   60.,   -1.,  -20.,   -2.,  -11., -113.,  -17.,
+        67.,  -56.,  -55.,    5.,  -28.,   15.,   -6.,  -32.,
+        7.,   -7.,   23.,   17.,  -18.,    8.,  -17.,   15.,
+        6.,   11.,   -4.,  -14.,  -11.,    7.,    2.,  -18.,
+        10.,    4.,   -5.,   23.,   10.,    1.,    8.,  -20.,
+        4.,    6.,  -18.,    0.,   12.,   -9.,    2.,    1.,
+        0.,    4.,   -3.,   -1.,    9.,   -2.,    8.,    3.,
+        0.,   -1.,    5.,    1.,   -3.,    4.,    4.,    1.,
+        0.,    0.,   -1.,    2.,    4.,   -5.,    6.,    1.,
+        1.,   -1.,   -1.,    6.,    2.,    0.,    0.,   -7.,
+        /* 1965 */
+        -30334.,-2119., 5776.,-1662., 2997.,-2016., 1594.,  114.,
+        1297.,-2038., -404., 1292.,  240.,  856., -165.,  957.,
+        804.,  148.,  479., -269., -390.,   13.,  252., -269.,
+        -219.,  358.,   19.,  254.,  128.,  -31., -126., -157.,
+        -97.,  -62.,   81.,   45.,   61.,  -11.,    8.,  100.,
+        -228.,   68.,    4.,  -32.,    1.,   -8., -111.,   -7.,
+        75.,  -57.,  -61.,    4.,  -27.,   13.,   -2.,  -26.,
+        6.,   -6.,   26.,   13.,  -23.,    1.,  -12.,   13.,
+        5.,    7.,   -4.,  -12.,  -14.,    9.,    0.,  -16.,
+        8.,    4.,   -1.,   24.,   11.,   -3.,    4.,  -17.,
+        8.,   10.,  -22.,    2.,   15.,  -13.,    7.,   10.,
+        -4.,   -1.,   -5.,   -1.,   10.,    5.,   10.,    1.,
+        -4.,   -2.,    1.,   -2.,   -3.,    2.,    2.,    1.,
+        -5.,    2.,   -2.,    6.,    4.,   -4.,    4.,    0.,
+        0.,   -2.,    2.,    3.,    2.,    0.,    0.,   -6.,
+        /* 1970 */
+        -30220.,-2068., 5737.,-1781., 3000.,-2047., 1611.,   25.,
+        1287.,-2091., -366., 1278.,  251.,  838., -196.,  952.,
+        800.,  167.,  461., -266., -395.,   26.,  234., -279.,
+        -216.,  359.,   26.,  262.,  139.,  -42., -139., -160.,
+        -91.,  -56.,   83.,   43.,   64.,  -12.,   15.,  100.,
+        -212.,   72.,    2.,  -37.,    3.,   -6., -112.,    1.,
+        72.,  -57.,  -70.,    1.,  -27.,   14.,   -4.,  -22.,
+        8.,   -2.,   23.,   13.,  -23.,   -2.,  -11.,   14.,
+        6.,    7.,   -2.,  -15.,  -13.,    6.,   -3.,  -17.,
+        5.,    6.,    0.,   21.,   11.,   -6.,    3.,  -16.,
+        8.,   10.,  -21.,    2.,   16.,  -12.,    6.,   10.,
+        -4.,   -1.,   -5.,    0.,   10.,    3.,   11.,    1.,
+        -2.,   -1.,    1.,   -3.,   -3.,    1.,    2.,    1.,
+        -5.,    3.,   -1.,    4.,    6.,   -4.,    4.,    0.,
+        1.,   -1.,    0.,    3.,    3.,    1.,   -1.,   -4.,
+        /* 1975 */
+        -30100.,-2013., 5675.,-1902., 3010.,-2067., 1632.,  -68.,
+        1276.,-2144., -333., 1260.,  262.,  830., -223.,  946.,
+        791.,  191.,  438., -265., -405.,   39.,  216., -288.,
+        -218.,  356.,   31.,  264.,  148.,  -59., -152., -159.,
+        -83.,  -49.,   88.,   45.,   66.,  -13.,   28.,   99.,
+        -198.,   75.,    1.,  -41.,    6.,   -4., -111.,   11.,
+        71.,  -56.,  -77.,    1.,  -26.,   16.,   -5.,  -14.,
+        10.,    0.,   22.,   12.,  -23.,   -5.,  -12.,   14.,
+        6.,    6.,   -1.,  -16.,  -12.,    4.,   -8.,  -19.,
+        4.,    6.,    0.,   18.,   10.,  -10.,    1.,  -17.,
+        7.,   10.,  -21.,    2.,   16.,  -12.,    7.,   10.,
+        -4.,   -1.,   -5.,   -1.,   10.,    4.,   11.,    1.,
+        -3.,   -2.,    1.,   -3.,   -3.,    1.,    2.,    1.,
+        -5.,    3.,   -2.,    4.,    5.,   -4.,    4.,   -1.,
+        1.,   -1.,    0.,    3.,    3.,    1.,   -1.,   -5.,
+        /* 1980 */
+        -29992.,-1956., 5604.,-1997., 3027.,-2129., 1663., -200.,
+        1281.,-2180., -336., 1251.,  271.,  833., -252.,  938.,
+        782.,  212.,  398., -257., -419.,   53.,  199., -297.,
+        -218.,  357.,   46.,  261.,  150.,  -74., -151., -162.,
+        -78.,  -48.,   92.,   48.,   66.,  -15.,   42.,   93.,
+        -192.,   71.,    4.,  -43.,   14.,   -2., -108.,   17.,
+        72.,  -59.,  -82.,    2.,  -27.,   21.,   -5.,  -12.,
+        16.,    1.,   18.,   11.,  -23.,   -2.,  -10.,   18.,
+        6.,    7.,    0.,  -18.,  -11.,    4.,   -7.,  -22.,
+        4.,    9.,    3.,   16.,    6.,  -13.,   -1.,  -15.,
+        5.,   10.,  -21.,    1.,   16.,  -12.,    9.,    9.,
+        -5.,   -3.,   -6.,   -1.,    9.,    7.,   10.,    2.,
+        -6.,   -5.,    2.,   -4.,   -4.,    1.,    2.,    0.,
+        -5.,    3.,   -2.,    6.,    5.,   -4.,    3.,    0.,
+        1.,   -1.,    2.,    4.,    3.,    0.,    0.,   -6.,
+        /* 1985 */
+        -29873.,-1905., 5500.,-2072., 3044.,-2197., 1687., -306.,
+        1296.,-2208., -310., 1247.,  284.,  829., -297.,  936.,
+        780.,  232.,  361., -249., -424.,   69.,  170., -297.,
+        -214.,  355.,   47.,  253.,  150.,  -93., -154., -164.,
+        -75.,  -46.,   95.,   53.,   65.,  -16.,   51.,   88.,
+        -185.,   69.,    4.,  -48.,   16.,   -1., -102.,   21.,
+        74.,  -62.,  -83.,    3.,  -27.,   24.,   -2.,   -6.,
+        20.,    4.,   17.,   10.,  -23.,    0.,   -7.,   21.,
+        6.,    8.,    0.,  -19.,  -11.,    5.,   -9.,  -23.,
+        4.,   11.,    4.,   14.,    4.,  -15.,   -4.,  -11.,
+        5.,   10.,  -21.,    1.,   15.,  -12.,    9.,    9.,
+        -6.,   -3.,   -6.,   -1.,    9.,    7.,    9.,    1.,
+        -7.,   -5.,    2.,   -4.,   -4.,    1.,    3.,    0.,
+        -5.,    3.,   -2.,    6.,    5.,   -4.,    3.,    0.,
+        1.,   -1.,    2.,    4.,    3.,    0.,    0.,   -6.,
+        /* 1990 */
+        -29775.,-1848., 5406.,-2131., 3059.,-2279., 1686., -373.,
+        1314.,-2239., -284., 1248.,  293.,  802., -352.,  939.,
+        780.,  247.,  325., -240., -423.,   84.,  141., -299.,
+        -214.,  353.,   46.,  245.,  154., -109., -153., -165.,
+        -69.,  -36.,   97.,   61.,   65.,  -16.,   59.,   82.,
+        -178.,   69.,    3.,  -52.,   18.,    1.,  -96.,   24.,
+        77.,  -64.,  -80.,    2.,  -26.,   26.,    0.,   -1.,
+        21.,    5.,   17.,    9.,  -23.,    0.,   -4.,   23.,
+        5.,   10.,   -1.,  -19.,  -10.,    6.,  -12.,  -22.,
+        3.,   12.,    4.,   12.,    2.,  -16.,   -6.,  -10.,
+        4.,    9.,  -20.,    1.,   15.,  -12.,   11.,    9.,
+        -7.,   -4.,   -7.,   -2.,    9.,    7.,    8.,    1.,
+        -7.,   -6.,    2.,   -3.,   -4.,    2.,    2.,    1.,
+        -5.,    3.,   -2.,    6.,    4.,   -4.,    3.,    0.,
+        1.,   -2.,    3.,    3.,    3.,   -1.,    0.,   -6.,
+        /* 1995 */
+        -29692.,-1784., 5306.,-2200., 3070.,-2366., 1681., -412.,
+        1335.,-2266., -262., 1248.,  302.,  758., -427.,  940.,
+        780.,  262.,  290., -236., -418.,   97.,  122., -306.,
+        -214.,  352.,   46.,  235.,  165., -118., -142., -166.,
+        -55.,  -17.,  107.,   68.,   67.,  -17.,   68.,   72.,
+        -170.,   67.,    0.,  -58.,   18.,    1.,  -93.,   36.,
+        77.,  -72.,  -69.,    0.,  -25.,   28.,    4.,    5.,
+        24.,    4.,   17.,    8.,  -24.,   -2.,   -6.,   25.,
+        6.,   11.,   -6.,  -21.,   -9.,    8.,  -14.,  -23.,
+        9.,   14.,    6.,   11.,   -4.,  -16.,   -7.,   -4.,
+        4.,    9.,  -20.,    2.,   15.,  -10.,   12.,    8.,
+        -6.,   -8.,   -8.,   -1.,    8.,   10.,    5.,   -2.,
+        -8.,   -8.,    3.,   -3.,   -6.,    1.,    2.,    0.,
+        -4.,    4.,   -1.,    5.,    4.,   -5.,    2.,   -1.,
+        2.,   -2.,    5.,    1.,    1.,   -2.,    0.,   -7.,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+        /* 2000 */
+        -29619.4,-1728.2, 5186.1,-2267.7, 3068.4,-2481.6, 1670.9,
+        -458.0, 1339.6,-2288.0, -227.6, 1252.1,  293.4,  714.5,
+        -491.1,  932.3,  786.8,  272.6,  250.0, -231.9, -403.0,
+        119.8,  111.3, -303.8, -218.8,  351.4,   43.8,  222.3,
+        171.9, -130.4, -133.1, -168.6,  -39.3,  -12.9,  106.3,
+        72.3,   68.2,  -17.4,   74.2,   63.7, -160.9,   65.1,
+        -5.9,  -61.2,   16.9,    0.7,  -90.4,   43.8,   79.0,
+        -74.0,  -64.6,    0.0,  -24.2,   33.3,    6.2,    9.1,
+        24.0,    6.9,   14.8,    7.3,  -25.4,   -1.2,   -5.8,
+        24.4,    6.6,   11.9,   -9.2,  -21.5,   -7.9,    8.5,
+        -16.6,  -21.5,    9.1,   15.5,    7.0,    8.9,   -7.9,
+        -14.9,   -7.0,   -2.1,    5.0,    9.4,  -19.7,    3.0,
+        13.4,   -8.4,   12.5,    6.3,   -6.2,   -8.9,   -8.4,
+        -1.5,    8.4,    9.3,    3.8,   -4.3,   -8.2,   -8.2,
+        4.8,   -2.6,   -6.0,    1.7,    1.7,    0.0,   -3.1,
+        4.0,   -0.5,    4.9,    3.7,   -5.9,    1.0,   -1.2,
+        2.0,   -2.9,    4.2,    0.2,    0.3,   -2.2,   -1.1,
+        -7.4,    2.7,   -1.7,    0.1,   -1.9,    1.3,    1.5,
+        -0.9,   -0.1,   -2.6,    0.1,    0.9,   -0.7,   -0.7,
+        0.7,   -2.8,    1.7,   -0.9,    0.1,   -1.2,    1.2,
+        -1.9,    4.0,   -0.9,   -2.2,   -0.3,   -0.4,    0.2,
+        0.3,    0.9,    2.5,   -0.2,   -2.6,    0.9,    0.7,
+        -0.5,    0.3,    0.3,    0.0,   -0.3,    0.0,   -0.4,
+        0.3,   -0.1,   -0.9,   -0.2,   -0.4,   -0.4,    0.8,
+        -0.2,   -0.9,   -0.9,    0.3,    0.2,    0.1,    1.8,
+        -0.4,   -0.4,    1.3,   -1.0,   -0.4,   -0.1,    0.7,
+        0.7,   -0.4,    0.3,    0.3,    0.6,   -0.1,    0.3,
+        0.4,   -0.2,    0.0,   -0.5,    0.1,   -0.9,
+        /* 2002 */
+        13.3,  11.6, -21.2, -14.4,  -3.7, -22.7,  -3.6, -11.1,
+        -1.1,  -3.5,   5.6,  -1.2,  -4.5,  -8.5,  -8.0,  -2.7,
+        2.2,   1.7,  -8.0,   1.0,   4.5,   5.1,  -1.9,  -0.3,
+        -1.4,   0.7,  -0.3,  -2.6,   1.5,  -1.2,   2.0,   0.0,
+        3.8,  -0.2,  -0.5,   0.4,   0.3,  -0.7,   0.7,  -1.8,
+        1.9,  -0.2,  -1.7,  -0.4,  -0.5,  -0.2,   0.7,   1.5,
+        0.2,  -0.1,   0.7,  -0.3,   0.3,   1.1,   0.1,   0.7,
+        0.3,   0.5,  -0.8,  -0.3,  -0.1,   0.5,   0.2,   0.1,
+        0.2,  -0.2,  -0.5,   0.1,   0.2,   0.3,  -0.4,   0.4,
+        0.2,   0.1,   0.5,  -0.3,  -0.7,   0.4,   0.4,   0.4,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+        };